const swapAttribute = (a, b, attribute) => {
  const originalA = a[attribute];
  const originalB = b[attribute];

  a[attribute] = originalB;
  b[attribute] = originalA;
};

const swapHandles = (a, b) => {
  swapAttribute(a, b, 'x');
  swapAttribute(a, b, 'y');
  swapAttribute(a, b, 'moving');
  swapAttribute(a, b, 'hover');
  swapAttribute(a, b, 'active');
  swapAttribute(a, b, 'selected');
};

export default function invertHandles(eventData, measurementData, handle) {
  const { rowPixelSpacing, columnPixelSpacing } = eventData.image;
  const { handles } = measurementData;
  const { start, end, perpendicularStart, perpendicularEnd } = handles;

  // Calculate the long axis length
  const dx = (start.x - end.x) * (columnPixelSpacing || 1);
  const dy = (start.y - end.y) * (rowPixelSpacing || 1);
  const length = Math.sqrt(dx * dx + dy * dy);

  // Calculate the short axis length
  const wx =
    (perpendicularStart.x - perpendicularEnd.x) * (columnPixelSpacing || 1);
  const wy =
    (perpendicularStart.y - perpendicularEnd.y) * (rowPixelSpacing || 1);
  const width = Math.sqrt(wx * wx + wy * wy) || 0;

  if (width > length) {
    swapHandles(start, end);
    swapHandles(start, perpendicularStart);
    swapHandles(end, perpendicularEnd);

    return Object.values(handles).find(h => h.moving === true);
  }

  return handle;
}
